#include <SPI.h>
#include <Wire.h>
#include <RF24.h>

RF24 SendRadio(10, 9); // CE: D10, CSN: D9

// 定义地址数组（全局变量）
const byte address[5] = {0xF0, 0xF0, 0xF0, 0xF0, 0x66};

// 定义传输协议
const uint8_t HEADER = 0xAA;
const uint8_t TYPE_PIN_STATE = 0x01; // 引脚状态类型
const uint8_t TYPE_STRING = 0x02;    // 字符串类型

// 引脚列表
const uint8_t pins[] = {6, 7}; // 可扩展为更多引脚
const uint8_t numPins = sizeof(pins) / sizeof(pins[0]);

// 字节数组用于存储数据帧
uint8_t buffer[32];

void setup() {
  Serial.begin(115200);
  for (uint8_t i = 0; i < numPins; i++) {
    pinMode(pins[i], INPUT); // 设置为输入引脚
  }

  SendRadio.begin();
  SendRadio.setAddressWidth(5);
  SendRadio.openWritingPipe(address);
  SendRadio.setChannel(115);           // 通道115
  SendRadio.setPALevel(RF24_PA_LOW);   // 低功率
  SendRadio.setDataRate(RF24_1MBPS);   // 数据速率1Mbps
  SendRadio.stopListening();           // 停止接收
  Serial.println("Sender initialized.");
}

void sendPinStates() {
  // 构造数据帧
  buffer[0] = HEADER;             // 帧头
  buffer[1] = numPins + 1;        // 数据长度（包括类型字段）
  buffer[2] = TYPE_PIN_STATE;     // 数据类型：引脚状态
  for (uint8_t i = 0; i < numPins; i++) {
    buffer[3 + i] = digitalRead(pins[i]); // 读取每个引脚状态
  }

  // 发送数据帧
  SendRadio.write(buffer, 3 + numPins); // Header + Length + Type + Payload
  Serial.print("Sent Pin States: ");
  for (uint8_t i = 0; i < 3 + numPins; i++) {
    Serial.print(buffer[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
}

void sendString(const char* message) {
  // 构造数据帧
  buffer[0] = HEADER;                  // 帧头
  uint8_t length = strlen(message);    // 字符串长度
  buffer[1] = length + 1;              // 数据长度（包括类型字段）
  buffer[2] = TYPE_STRING;             // 数据类型：字符串
  memcpy(&buffer[3], message, length); // 将字符串复制到 Payload

  // 发送数据帧
  SendRadio.write(buffer, 3 + length); // Header + Length + Type + Payload
  Serial.print("Sent String: ");
  Serial.println(message);
}

void loop() {
  sendPinStates(); // 发送引脚状态
  delay(1000);

  sendString("Hello!"); // 发送字符串
  delay(2000);
}